λ€μν λΈλΌμ°μ μ κΈ°κΈ°μμ λΆλλ½κ³ λ§€λ ₯μ μΈ UI μ λ°μ΄νΈλ₯Ό μμ±νκΈ° μν μμ μΊ‘μ² μ€μ μ μ΄μ μ λ§μΆ° CSS λ·° νΈλμ§μ μ 볡μ‘μ±μ νꡬν©λλ€.
CSS λ·° νΈλμ§μ λ§μ€ν°νκΈ°: λ§€λλ¬μ΄ UI μ λ°μ΄νΈλ₯Ό μν μμ μΊ‘μ² μ€μ
CSS λ·° νΈλμ§μ μ μΉ μ ν리μΌμ΄μ μ μ¬λ¬ μν μ¬μ΄λ₯Ό μ λλ©μ΄μ μΌλ‘ μ ννλ κ°λ ₯νκ³ μ°μν λ°©λ²μ μ 곡νμ¬, λ λ§€λ ₯μ μ΄κ³ μ§κ΄μ μΈ μ¬μ©μ κ²½νμ λ§λ€μ΄λ λλ€. μ΄ κΈ°λ₯μ ν΅ν΄ κ°λ°μλ μμκ° μ΄λ»κ² μ νλμ΄μΌ νλμ§ μ μν μ μμ΄ UI μ λ°μ΄νΈκ° μ μ°νκ³ μμ°μ€λ½κ² λκ»΄μ§λλ‘ ν©λλ€. CSS λ·° νΈλμ§μ μ κ°μ₯ μ€μν μΈ‘λ©΄ μ€ νλλ μμ μΊ‘μ²λ₯Ό μ€μ νλ κΈ°λ₯μΈλ°, μ΄λ λΈλΌμ°μ κ° μ ν κ³Όμ λμ μμλ₯Ό μλ³νκ³ μΆμ νλ λ°©λ²μ κ²°μ ν©λλ€.
CSS λ·° νΈλμ§μ μμ μμ μΊ‘μ² μ΄ν΄νκΈ°
μμ μΊ‘μ²λ λΈλΌμ°μ κ° UIμ μ΄μ μνμ μ μνμ μλ μ΄λ€ μμκ° μλ‘ λμνλμ§λ₯Ό μλ³νλ λ©μ»€λμ¦μ
λλ€. μ΄λ¬ν λμ κ΄κ³λ λΆλλ½κ³ μλ―Έ μλ μ νμ λ§λλ λ° νμμ μ
λλ€. μ μ ν μμ μΊ‘μ² μ€μ μ΄ μμΌλ©΄ λΈλΌμ°μ λ μμλ₯Ό μ¬λ°λ₯΄κ² μ λλ©μ΄μ
ννμ§ λͺ»νμ¬ κ°μμ€λ½κ±°λ μμμΉ λͺ»ν κ²°κ³Όλ₯Ό μ΄λν μ μμ΅λλ€. μμ μΊ‘μ²μ μ¬μ©λλ μ£Όμ CSS μμ±μ view-transition-nameμ
λλ€.
view-transition-name μμ±μ μμμ κ³ μ ν μλ³μλ₯Ό ν λΉν©λλ€. λ·° νΈλμ§μ
μ΄ λ°μνλ©΄ λΈλΌμ°μ λ μ΄μ DOM νΈλ¦¬μ μ DOM νΈλ¦¬ λͺ¨λμμ λμΌν view-transition-nameμ κ°μ§ μμλ₯Ό μ°Ύμ΅λλ€. μΌμΉνλ μμλ₯Ό μ°ΎμΌλ©΄ μ΄λ₯Ό λμΌν λ
Όλ¦¬μ μμλ‘ κ°μ£Όνκ³ μ΄μ μνμ μ μν μ¬μ΄μ μ νμ μ λλ©μ΄μ
μΌλ‘ μ²λ¦¬ν©λλ€.
view-transition-name μμ± μ¬μΈ΅ λΆμ
view-transition-name μμ±μ μ¬λ¬ κ°μ κ°μ§ μ μμ΅λλ€:
none: κΈ°λ³Έκ°μ λλ€. μμκ° λ·° νΈλμ§μ μ μ°Έμ¬νμ§ μμμΌ ν¨μ λνλ λλ€. μ΄ μμμ λν λ³κ²½μ μ λλ©μ΄μ μμ΄ μ¦μ λ°μν©λλ€.auto: λΈλΌμ°μ κ° μμμ λν κ³ μ μλ³μλ₯Ό μλμΌλ‘ μμ±ν©λλ€. μ΄λ€ μμκ° μΌμΉνλμ§μ λν μΈλ°ν μ μ΄κ° νμ μλ κ°λ¨ν μ νμ μ μ©ν©λλ€.<custom-ident>: μ¬μ©μκ° μ μνλ μ¬μ©μ μ§μ μλ³μμ λλ€. μ΄λ₯Ό ν΅ν΄ μ¬λ¬ μνμ κ±Έμ³ μ΄λ€ μμκ° μΌμΉν΄μΌ νλμ§ λͺ μμ μΌλ‘ μ§μ ν μ μμ΅λλ€. μ΄κ²μ μμ μΊ‘μ² νλ‘μΈμ€λ₯Ό μμ ν μ μ΄ν μ μκ² ν΄μ£Όλ―λ‘ κ°μ₯ κ°λ ₯νκ³ μ μ°ν μ΅μ μ λλ€.<custom-ident>λ λ¬Έμλ‘ μμν΄μΌ νλ©° λ¬Έμ, μ«μ, νμ΄ν, λ°μ€λ§ ν¬ν¨ν μ μμ΅λλ€. λμλ¬Έμλ₯Ό ꡬλΆν©λλ€.
view-transition-name μ¬μ©λ² μ€μ μμ
μμ 1: κΈ°λ³Έ μμ μ ν
ν΄λ¦ μ ν μ€νΈμ λ°°κ²½μμ΄ λ³κ²½λλ κ°λ¨ν λ²νΌμ΄ μλ€κ³ κ°μ ν΄ λ΄ μλ€.
HTML:
<button id="myButton" style="background-color: lightblue;">Click Me</button>
JavaScript:
myButton.addEventListener('click', () => {
document.startViewTransition(() => {
myButton.textContent = 'Clicked!';
myButton.style.backgroundColor = 'lightgreen';
});
});
CSS:
#myButton {
view-transition-name: my-button;
transition: none; /* μμμ νΈλμ§μ
λΉνμ±ν */
}
μ΄ μμ μμλ λ²νΌμ "my-button"μ΄λΌλ view-transition-nameμ ν λΉν©λλ€. λ²νΌμ ν΄λ¦νλ©΄ document.startViewTransition() ν¨μκ° λ·° νΈλμ§μ
μ νΈλ¦¬κ±°ν©λλ€. λΈλΌμ°μ λ λ²νΌμ ν
μ€νΈμ λ°°κ²½μ λ³κ²½μ λΆλλ½κ² μ λλ©μ΄μ
μΌλ‘ μ²λ¦¬ν©λλ€.
μμ 2: μ±κΈ νμ΄μ§ μ ν리μΌμ΄μ (SPA)μμ νμ΄μ§ κ° μ ν
SPAμμλ μ’ μ’ λ€λ₯Έ λ·°λ νμ΄μ§ κ°μ μ νν΄μΌ ν©λλ€. CSS λ·° νΈλμ§μ μ μ΄λ¬ν μ νμ ν¨μ¬ λ λ§€λλ½κ² λ§λ€ μ μμ΅λλ€.
μ ν μΉ΄λ λͺ©λ‘κ³Ό κ° μ νμ μμΈ νμ΄μ§κ° μλ SPAλ₯Ό μμν΄ λ³΄μΈμ. λͺ©λ‘μμ μμΈ νμ΄μ§λ‘ μ΄λν λ λΆλλ¬μ΄ μ νμ μν©λλ€.
HTML (μ ν λͺ©λ‘):
<ul id="productList">
<li class="product-card" data-product-id="1">
<img src="product1.jpg" alt="Product 1" view-transition-name="product-image-1">
<h2 view-transition-name="product-title-1">Product 1</h2>
<p>Description of Product 1</p>
</li>
<li class="product-card" data-product-id="2">
<img src="product2.jpg" alt="Product 2" view-transition-name="product-image-2">
<h2 view-transition-name="product-title-2">Product 2</h2>
<p>Description of Product 2</p>
</li>
</ul>
HTML (μ ν μμΈ νμ΄μ§ - μ ν 1 μμ):
<div id="productDetail">
<img src="product1.jpg" alt="Product 1" view-transition-name="product-image-1">
<h1 view-transition-name="product-title-1">Product 1 - Detailed View</h1>
<p>Detailed description of Product 1 with more information...</p>
</div>
JavaScript (κ°μν):
function showProductDetail(productId) {
document.startViewTransition(() => {
// DOMμ μ
λ°μ΄νΈνμ¬ μ ν μμΈ νμ΄μ§λ₯Ό νμν©λλ€
// μ¬κΈ°μλ μ ν λͺ©λ‘μ μ¨κΈ°κ³ μ ν μμΈ μμλ₯Ό νμνλ μμ
μ΄ ν¬ν¨λ©λλ€
// μ€μ: μ΄μ (μ ν λͺ©λ‘) DOM ꡬ쑰μ μ(μ ν μμΈ) DOM ꡬ쑰 λͺ¨λμ
// λμΌν view-transition-name κ°μ΄ μλμ§ νμΈν΄μΌ ν©λλ€
// μ€μ μ ν리μΌμ΄μ
μμλ μ ν μΈλΆ μ 보λ₯Ό λμ μΌλ‘ κ°μ Έμ¬ κ²μ
λλ€
// (κ°μνλ¨, μμΈ νμ΄μ§μ HTMLμ΄ μ΄λ―Έ λ‘λλμ΄ νμλ§ νλ©΄ λλ€κ³ κ°μ )
document.getElementById('productList').style.display = 'none';
document.getElementById('productDetail').style.display = 'block';
});
}
// μμ μ¬μ©λ²: μ ν μΉ΄λλ₯Ό ν΄λ¦νμ λ
const productCards = document.querySelectorAll('.product-card');
productCards.forEach(card => {
card.addEventListener('click', () => {
const productId = card.dataset.productId;
showProductDetail(productId);
});
});
CSS:
.product-card img {
transition: none; /* μμμ νΈλμ§μ
λΉνμ±ν */
}
.product-card h2 {
transition: none; /* μμμ νΈλμ§μ
λΉνμ±ν */
}
#productDetail img {
transition: none; /* μμμ νΈλμ§μ
λΉνμ±ν */
}
#productDetail h1 {
transition: none; /* μμμ νΈλμ§μ
λΉνμ±ν */
}
μ΄ μμ μμλ μ ν λͺ©λ‘κ³Ό μ ν μμΈ νμ΄μ§ λͺ¨λμμ μ ν μ΄λ―Έμ§μ μ λͺ©μ κ³ μ ν view-transition-name κ°μ ν λΉν©λλ€. κ° μ ν μΉ΄λμ λν΄ `view-transition-name`μ κ³ μ ν©λλ€ (μ: μ ν 1μ κ²½μ° `product-image-1`, `product-title-1`). μ¬μ©μκ° μ ν μΉ΄λλ₯Ό ν΄λ¦νλ©΄ showProductDetail() ν¨μκ° λ·° νΈλμ§μ
μ νΈλ¦¬κ±°νκ³ DOMμ μ
λ°μ΄νΈνμ¬ μ ν μμΈ νμ΄μ§λ₯Ό νμν©λλ€. κ·Έλ¬λ©΄ λΈλΌμ°μ λ μ΄λ―Έμ§μ μ λͺ© μμλ₯Ό μ ν λͺ©λ‘μμμ μμΉμμ μ ν μμΈ νμ΄μ§μμμ μμΉλ‘ μ λλ©μ΄μ
μ²λ¦¬νμ¬ λΆλλ¬μ΄ μκ°μ μ νμ λ§λλλ€.
μμ 3: λμ μ½ν μΈ μ²λ¦¬
λ§μ μΉ μ ν리μΌμ΄μ
μμλ JavaScriptλ₯Ό μ¬μ©νμ¬ μ½ν
μΈ λ₯Ό λμ μΌλ‘ λ‘λν©λλ€. λμ μ½ν
μΈ λ‘ μμ
ν λλ μ½ν
μΈ κ° λ‘λλ ν view-transition-name κ°μ΄ μ¬λ°λ₯΄κ² μ€μ λμλμ§ νμΈνλ κ²μ΄ μ€μν©λλ€. μ΄λ μ’
μ’
JavaScriptλ₯Ό μ¬μ©νμ¬ view-transition-name μμ±μ μΆκ°νκ±°λ μ
λ°μ΄νΈνλ κ²μ ν¬ν¨ν©λλ€.
APIμμ λΈλ‘κ·Έ κ²μλ¬Ό λͺ©λ‘μ κ°μ Έμ νμ΄μ§μ νμνλ μλ리μ€λ₯Ό μμν΄ λ³΄μΈμ. μ¬μ©μκ° λΈλ‘κ·Έ κ²μλ¬Όμ ν΄λ¦νμ¬ μ 체 λ΄μ©μ λ³Ό λ μ νμ μ λλ©μ΄μ μΌλ‘ μ²λ¦¬νκ³ μΆμ΅λλ€.
JavaScript (λΈλ‘κ·Έ κ²μλ¬Ό κ°μ Έμ€κΈ° λ° λ λλ§):
async function fetchBlogPosts() {
const response = await fetch('/api/blog-posts'); // μ€μ API μλν¬μΈνΈλ‘ κ΅μ²΄νμΈμ
const posts = await response.json();
const blogList = document.getElementById('blogList');
blogList.innerHTML = ''; // κΈ°μ‘΄ μ½ν
μΈ μ§μ°κΈ°
posts.forEach(post => {
const listItem = document.createElement('li');
listItem.classList.add('blog-post-item');
listItem.dataset.postId = post.id;
const titleElement = document.createElement('h2');
titleElement.textContent = post.title;
titleElement.viewTransitionName = `blog-title-${post.id}`; // λμ μΌλ‘ view-transition-name μ€μ
listItem.appendChild(titleElement);
const summaryElement = document.createElement('p');
summaryElement.textContent = post.summary;
listItem.appendChild(summaryElement);
listItem.addEventListener('click', () => showBlogPost(post.id));
blogList.appendChild(listItem);
});
}
async function showBlogPost(postId) {
document.startViewTransition(async () => {
// μ 체 λΈλ‘κ·Έ κ²μλ¬Ό μ½ν
μΈ κ°μ Έμ€κΈ°
const response = await fetch(`/api/blog-posts/${postId}`);
const post = await response.json();
// DOMμ μ 체 λΈλ‘κ·Έ κ²μλ¬Ό μ½ν
μΈ λ‘ μ
λ°μ΄νΈ
const blogPostDetail = document.getElementById('blogPostDetail');
blogPostDetail.innerHTML = `
<h1 view-transition-name="blog-title-${postId}">${post.title}</h1>
<p>${post.content}</p>
`;
// λΈλ‘κ·Έ λͺ©λ‘μ μ¨κΈ°κ³ λΈλ‘κ·Έ κ²μλ¬Ό μμΈ μ 보 νμ
document.getElementById('blogList').style.display = 'none';
blogPostDetail.style.display = 'block';
});
}
// νμ΄μ§ λ‘λ μ fetchBlogPosts νΈμΆ
fetchBlogPosts();
HTML:
<ul id="blogList"></ul>
<div id="blogPostDetail" style="display: none;"></div>
μ΄ μμ μμλ APIμμ λΈλ‘κ·Έ κ²μλ¬Όμ κ°μ Έμ λμ μΌλ‘ λͺ©λ‘ νλͺ©μ μμ±ν©λλ€. μ€μν μ μ JavaScriptλ₯Ό μ¬μ©νμ¬ κ° λΈλ‘κ·Έ κ²μλ¬Όμ μ λͺ© μμμ κ²μλ¬Ό IDλ₯Ό κΈ°λ°μΌλ‘ ν κ³ μ μλ³μλ‘ view-transition-nameμ μ€μ νλ€λ κ²μ
λλ€. μ΄λ κ² νλ©΄ μ 체 λΈλ‘κ·Έ κ²μλ¬Ό λ³΄κΈ°λ‘ μ νν λ μ λͺ© μμλ₯Ό μ¬λ°λ₯΄κ² μΌμΉμν¬ μ μμ΅λλ€. μ¬μ©μκ° λΈλ‘κ·Έ κ²μλ¬Όμ ν΄λ¦νλ©΄ showBlogPost() ν¨μκ° μ 체 λΈλ‘κ·Έ κ²μλ¬Ό μ½ν
μΈ λ₯Ό κ°μ Έμ DOMμ μ
λ°μ΄νΈν©λλ€. λΈλ‘κ·Έ κ²μλ¬Ό μμΈ λ³΄κΈ°μ μ λͺ© μμμλ λͺ©λ‘ 보기μμμ λμΌν μλ³μλ₯Ό μ¬μ©νμ¬ view-transition-nameμ΄ μ€μ λ©λλ€.
κ³ κΈ μμ μΊ‘μ² κΈ°μ
λμ view-transition-nameμ μν CSS λ³μ μ¬μ©
CSS λ³μ(μ¬μ©μ μ§μ μμ±)λ₯Ό μ¬μ©νμ¬ λμ μΈ view-transition-name κ°μ λ§λ€ μ μμ΅λλ€. μ΄λ μΌλΆ λμ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ κ³ μ μλ³μλ₯Ό μμ±ν΄μΌ ν λ μ μ©ν μ μμ΅λλ€.
:root {
--unique-id: 'some-unique-identifier';
}
.element {
view-transition-name: var(--unique-id);
}
κ·Έλ° λ€μ JavaScriptλ₯Ό μ¬μ©νμ¬ --unique-id CSS λ³μμ κ°μ μ
λ°μ΄νΈνμ¬ view-transition-nameμ λμ μΌλ‘ λ³κ²½ν μ μμ΅λλ€.
볡μ‘ν μλ리μ€λ₯Ό μν view-transition-nameκ³Ό JavaScript κ²°ν©
λ 볡μ‘ν μλ리μ€μμλ μμ μΊ‘μ² νλ‘μΈμ€λ₯Ό μ λ°νκ² μ μ΄νκΈ° μν΄ view-transition-nameμ JavaScriptμ κ²°ν©ν΄μΌ ν μλ μμ΅λλ€. μλ₯Ό λ€μ΄, UIμ νμ¬ μνμ λ°λΌ view-transition-name κ°μ λμ μΌλ‘ μΆκ°νκ±°λ μ κ±°ν΄μΌ ν μ μμ΅λλ€.
μ΄ μ κ·Ό λ°©μμ μ΅λμ μ μ°μ±μ μ 곡νμ§λ§ μμμΉ λͺ»ν κ²°κ³Όλ₯Ό νΌνκΈ° μν΄ μ μ€ν κ³νκ³Ό ꡬνμ΄ νμν©λλ€.
μΌλ°μ μΈ μμ μΊ‘μ² λ¬Έμ ν΄κ²°
μμκ° μμλλ‘ μ νλμ§ μμ
μμκ° μμλλ‘ μ νλμ§ μλ κ²½μ°, 첫 λ²μ§Έ λ¨κ³λ view-transition-name κ°μ νμΈνλ κ²μ
λλ€. UIμ μ΄μ μνμ μ μν λͺ¨λμμ μ¬λ°λ₯Έ μμκ° λμΌν view-transition-nameμ κ°μ§κ³ μλμ§ νμΈνμΈμ. λν view-transition-name κ°μ μ€νλ λΆμΌμΉκ° μλμ§ νμΈνμΈμ.
μμμΉ λͺ»ν μ ν
λλ‘λ μ λλ©μ΄μ
μ μλνμ§ μμ μμμμ μμμΉ λͺ»ν μ νμ΄ λ°μνλ κ²μ λ³Ό μ μμ΅λλ€. μ΄λ μμλ€μ΄ μ°μ°ν λμΌν view-transition-nameμ κ°μ§ λ λ°μν μ μμ΅λλ€. view-transition-name κ°μ λ€μ νμΈνκ³ μ ννλ €λ μμμ λν΄ κ³ μ νμ§ νμΈνμΈμ.
μ±λ₯ κ³ λ € μ¬ν
CSS λ·° νΈλμ§μ μ μ¬μ©μ κ²½νμ ν¬κ² ν₯μμν¬ μ μμ§λ§ μ±λ₯μ μΌλμ λλ κ²μ΄ μ€μν©λλ€. λ§μ μμλ₯Ό ν¬ν¨νλ 볡μ‘ν μ νμ κ³μ° λΉμ©μ΄ λ§μ΄ λ€κ³ μ ν리μΌμ΄μ μ λ°μμ±μ μν₯μ λ―ΈμΉ μ μμ΅λλ€. λΈλΌμ°μ μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ μ νμ νλ‘νμΌλ§νκ³ μ±λ₯ λ³λͺ© νμμ μλ³νμΈμ.
μ κ·Όμ± κ³ λ € μ¬ν
CSS λ·° νΈλμ§μ μ ꡬνν λλ μ κ·Όμ±μ κ³ λ €νλ κ²μ΄ μ€μν©λλ€. μ νμ΄ μμ§μμ λ―Όκ°ν μ¬μ©μμκ² λΆνΈν¨μ΄λ λ°©ν₯ κ°κ° μμ€μ μ λ°νμ§ μλλ‘ νμΈμ. μ¬μ©μκ° μνλ κ²½μ° μ λλ©μ΄μ μ λΉνμ±νν μ μλ λ°©λ²μ μ 곡νμΈμ.
μ¬μ©μκ° μμ€ν
μ€μ μμ μμ§μ κ°μλ₯Ό μμ²νλμ§ κ°μ§νκΈ° μν΄ prefers-reduced-motion λ―Έλμ΄ μΏΌλ¦¬λ₯Ό μ¬μ©νλ κ²μ κ³ λ €νμΈμ.
@media (prefers-reduced-motion: reduce) {
/* λ·° νΈλμ§μ
μ λΉνμ±ννκ±°λ λ κ°λ¨ν νΈλμ§μ
μ μ¬μ©ν©λλ€ */
::view-transition-old(*), ::view-transition-new(*) {
animation: none !important;
}
}
λΈλΌμ°μ νΈνμ± λ° μ μ§μ ν₯μ
CSS λ·° νΈλμ§μ μ λΉκ΅μ μλ‘μ΄ κΈ°λ₯μ΄λ©° λΈλΌμ°μ μ§μμ μμ§ λ°μ μ€μ λλ€. 2024λ νλ° κΈ°μ€μΌλ‘ ν¬λ‘λ―Έμ κΈ°λ° λΈλΌμ°μ (Chrome, Edge)μ Safariμμ μ§μλ©λλ€. Firefoxλ νλκ·Έ λ€μ μ€νμ μ§μμ΄ μ 곡λ©λλ€. CSS λ·° νΈλμ§μ μ μ μ§μ ν₯μμΌλ‘ ꡬννλ κ²μ΄ μ€μν©λλ€. μ΄λ λ·° νΈλμ§μ μ μ§μνμ§ μλ λΈλΌμ°μ μμλ μ ν리μΌμ΄μ μ΄ μ¬λ°λ₯΄κ² μλν΄μΌ ν¨μ μλ―Έν©λλ€. κΈ°λ₯ κ°μ§λ₯Ό μ¬μ©νμ¬ λΈλΌμ°μ κ° λ·° νΈλμ§μ μ μ§μνλμ§ νμΈν λ€μ μ νμ νμ±ννλ CSS λ° JavaScript μ½λλ₯Ό 쑰건λΆλ‘ μ μ©ν μ μμ΅λλ€.
if ('startViewTransition' in document) {
// λ·° νΈλμ§μ
μ΄ μ§μλ©λλ€
// λ·° νΈλμ§μ
μ μν CSS λ° JavaScript μ½λλ₯Ό μ μ©ν©λλ€
} else {
// λ·° νΈλμ§μ
μ΄ μ§μλμ§ μμ΅λλ€
// μ λλ©μ΄μ
μ΄ μλ μ ν λλ μ ν μ νμ΄ μλ κ²μΌλ‘ λ체ν©λλ€
}
μ¬μ©μ κ²½νμ λν κΈλ‘λ² κ΄μ
UI μ νμ λμμΈν λ μ¬μ©μμ λ¬Ένμ λ§₯λ½μ κ³ λ €νμΈμ. ν λ¬Ένμμ ν¨κ³Όμ μΈ μ λλ©μ΄μ μ€νμΌμ΄ λ€λ₯Έ λ¬Ένμμλ μ λ°μλ€μ¬μ§μ§ μμ μ μμ΅λλ€. μλ₯Ό λ€μ΄, μΌλΆ λ¬ΈνκΆμμλ λ λ―Έλ¬νκ³ μ μ λ μ λλ©μ΄μ μ μ νΈνλ λ°λ©΄, λ€λ₯Έ λ¬ΈνκΆμμλ λ λλ΄νκ³ ννλ ₯μ΄ νλΆν μ νμ μ νΈν©λλ€.
λν μ¬μ©μμ μΈμ΄μ μ½κΈ° λ°©ν₯μ κ³ λ €νμΈμ. νλ©΄μ κ°λ‘μ§λ¬ μμ§μ΄λ ν μ€νΈλ₯Ό ν¬ν¨νλ μ νμ ν΄λΉ μΈμ΄μ μ½κΈ° λ°©ν₯μ λ§κ² μ‘°μ λμ΄μΌ ν©λλ€. μλ₯Ό λ€μ΄, μλμ΄ λ° νλΈλ¦¬μ΄μ κ°μ μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ μ°λ μΈμ΄μμλ μ νμ΄ μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ μ΄λν΄μΌ ν©λλ€.
κ²°λ‘
CSS λ·° νΈλμ§μ
, νΉν view-transition-name μμ±μ μ¬μ©ν μ μ€ν μμ μΊ‘μ² μ€μ μ μΉ μ ν리μΌμ΄μ
μμ λΆλλ½κ³ λ§€λ ₯μ μΈ UI μ
λ°μ΄νΈλ₯Ό λ§λλ κ°λ ₯ν λ°©λ²μ μ 곡ν©λλ€. μμ μΊ‘μ²μ λ―Έλ¬ν μ°¨μ΄λ₯Ό μ΄ν΄νκ³ μ μ ν λ체 μ λ΅μ ꡬνν¨μΌλ‘μ¨ κ΄λ²μν λΈλΌμ°μ μ μ₯μΉμμ μ°μν μ¬μ©μ κ²½νμ μ 곡ν μ μμ΅λλ€. UI μ νμ λμμΈν λλ μ κ·Όμ±μ μ°μ μνκ³ μ¬μ©μμ λ¬Ένμ λ§₯λ½μ κ³ λ €νλ κ²μ μμ§ λ§μΈμ.
CSS λ·° νΈλμ§μ μ λν λΈλΌμ°μ μ§μμ΄ κ³μ μ¦κ°ν¨μ λ°λΌ, μ΄ κΈ°λ₯μ νλμ μ΄κ³ λ§€λ ₯μ μΈ μΉ κ²½νμ λ§λ€κ³ μ νλ μΉ κ°λ°μμκ² μ μ λ μ€μν λκ΅¬κ° λ κ²μ λλ€.